import { app, shell, BrowserWindow, ipcMain, globalShortcut, Tray, Menu } from 'electron'
import { join } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
import { exec } from 'child_process'
import { promisify } from 'util'

const execAsync = promisify(exec)

let tray; // 系统托盘实例
let mainWindow // 主窗口实例
let isAlwaysOnTop = false; // 在文件顶部添加窗口置顶状态变量

// 获取系统字体列表的函数
async function getSystemFonts(): Promise<string[]> {
  try {
    let fonts: string[] = []
    if (process.platform === 'win32') {
      // Windows 系统 - 使用PowerShell获取注册表中的字体
      try {
        // 使用reg query命令获取详细的注册表信息，并设置UTF-8编码
        const { stdout } = await execAsync('chcp 65001 >nul && reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"', { encoding: 'utf8' })

        // console.log('注册表字体信息:')
        // console.log(stdout)

        // 解析reg query的输出
        const lines = stdout.split('\n')
        const fontEntries: string[] = []

        for (let i = 0; i < lines.length; i++) {
          const line = lines[i].trim()

          // 查找包含字体名称的行（通常包含REG_SZ）
          if (line.includes('REG_SZ') && (line.includes('TrueType') || line.includes('OpenType') || line.includes('.ttf') || line.includes('.otf'))) {
            // 提取字体名称（在REG_SZ之前的部分）
            const parts = line.split('REG_SZ')
            if (parts.length >= 2) {
              let fontName = parts[0].trim()

              // 去掉字体名称中的样式信息
              fontName = fontName.replace(/\s*\(TrueType\)|\s*\(OpenType\)/gi, '')
              fontName = fontName.replace(/\s*(Bold|Italic|Regular|Light|Medium|Thin|Black|Condensed|Extended).*$/gi, '')
              fontName = fontName.trim()

              if (fontName && fontName.length > 0 && !fontEntries.includes(fontName)) {
                fontEntries.push(fontName)
              }
            }
          }
        }

        fonts = [...fonts, ...fontEntries]
        // console.log(`从注册表获取到 ${fontEntries.length} 个字体:`, fontEntries.slice(0, 10))

      } catch (error) {
        console.log('PowerShell方法失败，尝试备用方法:', error)
        // 备用方法：使用wmic命令
        try {
          const { stdout: wmicOutput } = await execAsync('chcp 65001 >nul && wmic datafile where "path=\'\\\\Windows\\\\Fonts\\\\\'" get name /format:list')
          console.log(wmicOutput);
          const fontFiles = wmicOutput.split('\n')
            .filter(line => line.startsWith('Name=') && (line.includes('.ttf') || line.includes('.otf')))
            .map(line => line.replace('Name=', '').replace(/\.(ttf|otf)$/i, '').trim())

          fonts = [...fonts, ...fontFiles]
        } catch (wmicError) {
          console.log('WMIC方法也失败:', wmicError)
        }
      }

    } else if (process.platform === 'darwin') {
      // macOS 系统
      try {
        const { stdout } = await execAsync('system_profiler SPFontsDataType | grep "Full Name:" | sed "s/.*Full Name: //"')
        fonts = stdout.split('\n').filter(line => line.trim()).map(line => line.trim())
      } catch (error) {
        console.log('macOS字体获取失败:', error)
      }

    } else if (process.platform === 'linux') {
      // Linux 系统
      try {
        const { stdout } = await execAsync('fc-list : family | cut -d, -f1 | sort -u')
        fonts = stdout.split('\n').filter(line => line.trim()).map(line => line.trim())
      } catch (error) {
        console.log('Linux字体获取失败:', error)
      }
    }

    // 添加一些常见的Web安全字体作为备选
    const webSafeFonts = [
      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Georgia',
      'Helvetica', 'Impact', 'Lucida Console', 'Lucida Sans Unicode',
      'Palatino Linotype', 'Tahoma', 'Times New Roman', 'Trebuchet MS',
      'Verdana', 'Consolas', 'Calibri', 'Cambria', 'Candara', 'Segoe UI',
      'Microsoft YaHei', '微软雅黑', 'SimSun', '宋体', 'SimHei', '黑体',
      'KaiTi', '楷体', 'FangSong', '仿宋', 'system-ui', 'sans-serif', 'serif', 'monospace'
    ]

    // 合并并去重
    fonts = [...new Set([...fonts, ...webSafeFonts])].filter(font => font && font.length > 0).sort()

    // console.log(`成功获取 ${fonts.length} 个系统字体`)
    return fonts

  } catch (error) {
    console.error('获取系统字体失败:', error)

    // 返回备用字体列表
    return [
      'Arial', 'Times New Roman', 'Helvetica', 'Georgia', 'Verdana',
      'Tahoma', 'Trebuchet MS', 'Arial Black', 'Impact', 'Comic Sans MS',
      'Courier New', 'Lucida Console', 'Consolas', 'Calibri', 'Cambria',
      'Microsoft YaHei', '微软雅黑', 'SimSun', '宋体', 'SimHei', '黑体',
      'KaiTi', '楷体', 'FangSong', '仿宋', 'system-ui', 'sans-serif', 'serif', 'monospace'
    ].sort()
  }
}

// 创建系统托盘
function createTray() {
  // 使用应用图标创建系统托盘
  tray = new Tray(icon);
  // 创建托盘的右键菜单
  const contextMenu = Menu.buildFromTemplate([
    {
      label: '显示/隐藏', // 菜单项标签
      click: () => {
        // 点击时切换窗口的显示状态
        if (mainWindow.isVisible()) {
          mainWindow.hide(); // 如果窗口可见则隐藏
        } else {
          mainWindow.show(); // 如果窗口隐藏则显示
        }
      }
    }, {
      label: '窗口置顶',
      type: 'checkbox',
      checked: isAlwaysOnTop,
      click: () => {
        isAlwaysOnTop = !isAlwaysOnTop;
        mainWindow?.setAlwaysOnTop(isAlwaysOnTop);
      }
    },
    {
      label: '退出', // 退出应用的菜单项
      click: () => {
        app.quit(); // 退出应用程序
      }
    }
  ]);

  // 设置托盘图标的提示文本
  tray.setToolTip('我的应用');
  // 将上下文菜单附加到托盘
  tray.setContextMenu(contextMenu);

  // 监听托盘图标的点击事件
  tray.on('click', () => {
    // 切换窗口的显示状态
    if (mainWindow.isVisible()) {
      mainWindow.hide();
    } else {
      mainWindow.show();
    }
  });
}

// 创建主窗口
function createWindow(): void {
  // 创建浏览器窗口实例
  mainWindow = new BrowserWindow({
    minWidth: 10, // 最小宽度
    minHeight: 10, // 最小高度
    backgroundColor: '#00000000', // 设置透明背景
    transparent: true, // 启用窗口透明
    resizable: true, // 允许调整窗口大小
    show: false, // 初始时隐藏窗口
    frame: false, // 无边框窗口
    autoHideMenuBar: true, // 自动隐藏菜单栏
    skipTaskbar: true, // 不在任务栏显示
    ...(process.platform === 'linux' ? { icon } : {}), // 在 Linux 平台设置应用图标
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'), // 预加载脚本路径
      sandbox: false, // 禁用沙箱
      webviewTag: true // 启用 webview 标签支持
    }
  })

  // 当窗口准备好显示时触发
  mainWindow.on('ready-to-show', () => {
    mainWindow.show() // 显示窗口
  })

  // 设置窗口打开处理程序
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url) // 在默认浏览器中打开外部链接
    return { action: 'deny' } // 阻止在应用内创建新窗口
  })

  // 加载应用内容
  // 根据开发环境或生产环境加载不同的内容
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    // 开发环境：加载开发服务器 URL
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    // 生产环境：加载打包后的 HTML 文件
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }
}

// 当 Electron 完成初始化时执行
app.whenReady().then(() => {
  // 设置应用程序 ID（Windows）
  electronApp.setAppUserModelId('com.electron')

  // 监听窗口创建事件
  // 设置窗口快捷键（F12 开发工具，禁用 Ctrl+R 刷新）
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window)
  })

  // IPC 通信测试
  ipcMain.on('ping', () => console.log('pong'))

  // 处理设置窗口透明度的 IPC 请求
  ipcMain.handle('set-opacity', (_, opacity) => {
    const mainWindow = BrowserWindow.getFocusedWindow()
    if (mainWindow) {
      let realOpacity = opacity * 1; // 计算实际透明度
      mainWindow.setOpacity(realOpacity) // 设置窗口透明度
      return opacity
    }
    return null
  })

  // 添加获取系统字体的IPC处理器
  ipcMain.handle('get-system-fonts', async () => {
    return await getSystemFonts()
  })

  // 注册全局快捷键 Ctrl+H
  globalShortcut.register('Ctrl+h', () => {
    const win = BrowserWindow.getFocusedWindow();
    if (win) {
      // 发送消息到渲染进程，切换控制面板显示状态
      win.webContents.send('toggle-controls');
    }
  });

  // 注册全局快捷键 Ctrl+H
  globalShortcut.register('Ctrl+Alt+z', () => {
    // 点击时切换窗口的显示状态
    if (mainWindow.isVisible()) {
      mainWindow.hide(); // 如果窗口可见则隐藏
    } else {
      mainWindow.show(); // 如果窗口隐藏则显示
    }
  });

  // 创建主窗口和系统托盘
  createWindow();
  createTray();

  // macOS 应用激活处理
  app.on('activate', function () {
    // 当点击 dock 图标且没有其他窗口打开时，创建一个新窗口
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 应用退出前清理快捷键
app.on('will-quit', () => {
  globalShortcut.unregisterAll(); // 注销所有全局快捷键
});

// 处理所有窗口关闭事件
app.on('window-all-closed', () => {
  // 在 macOS 以外的平台，当所有窗口关闭时退出应用
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 处理 webview 创建事件
app.on('web-contents-created', (_, contents) => {
  if (contents.getType() === 'webview') {
    // 设置 webview 的窗口打开处理程序
    contents.setWindowOpenHandler(({ url }) => {
      contents.loadURL(url); // 在当前 webview 中加载 URL
      return { action: 'deny' }; // 阻止创建新窗口
    });
  }
});

// 处理所有窗口关闭事件的附加逻辑
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    // 在非 macOS 平台，当窗口不可见时退出应用
    if (!mainWindow.isVisible()) {
      app.quit();
    }
  }
});

// 文件结束注释
// 此文件包含了 Electron 应用的主进程代码
// 负责管理应用生命周期、窗口创建、系统托盘、IPC 通信等核心功能
